/**
 * 加载状态管理工具
 * 解决 hideLoading:fail toast can't be found 错误
 * 确保每次hide都有对应的show
 */
export const LoadingUtil = {
  // 跟踪计数，处理嵌套调用
  loadingCount: 0,
  
  /**
   * 显示加载提示
   * @param {string} title - 加载提示文字
   * @param {boolean} mask - 是否显示遮罩
   */
  show(title = '加载中...', mask = true) {
    this.loadingCount++;
    // 只有第一次调用时才真正显示
    if (this.loadingCount === 1) {
      uni.showLoading({
        title,
        mask,
        fail: (err) => {
          console.error('显示加载失败:', err);
          this.loadingCount = 0;
        }
      });
    }
  },
  
  /**
   * 隐藏加载提示
   */
  hide() {
    // 只有计数大于0时才执行
    if (this.loadingCount > 0) {
      this.loadingCount--;
      // 最后一次调用时才真正隐藏
      if (this.loadingCount === 0) {
        uni.hideLoading({
          fail: (err) => {
            console.error('隐藏加载失败:', err);
            // 强制重置计数
            this.loadingCount = 0;
          }
        });
      }
    }
  },
  
  /**
   * 自动管理加载状态的异步操作包装器
   * @param {Function} asyncFunc - 异步操作函数
   * @param {string} title - 加载提示文字
   * @returns {Promise} 返回异步操作的结果
   */
  wrap(asyncFunc, title = '加载中...') {
    return new Promise((resolve, reject) => {
      this.show(title);
      try {
        // 执行异步操作
        const result = asyncFunc();
        // 判断是否为Promise
        if (result instanceof Promise) {
          result.then(resolve).catch(reject).finally(() => this.hide());
        } else {
          resolve(result);
          this.hide();
        }
      } catch (err) {
        reject(err);
        this.hide();
      }
    });
  }
};
